package com.itheima.d2_reflect;

import org.junit.Test;

import javax.xml.namespace.QName;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/*
     目标：掌握获取类的成员变量，并对其进行操作。

     Class类中方法
        public Field[] getFields()	获取类的全部成员变量（只能获取public修饰的）
        public Field[] getDeclaredFields()	获取类的全部成员变量（只要存在就能拿到）
        public Field getField(String name)	获取类的某个成员变量（只能获取public修饰的）
        public Field getDeclaredField(String name)	获取类的某个成员变量（只要存在就能拿到）
    Field类中的方法
        void set(Object obj, Object value)：	赋值
        Object get(Object obj)	取值
        public void  setAccessible(boolean flag)	设置为true，表示禁止检查访问控制（暴力反射）

   需求 : 操作猫类的成员变量
 */
public class Test3Field {
    private static final Object COUNTRY = null;

    @Test
    public void testGetFields() throws IllegalAccessException, NoSuchMethodException, InvocationTargetException, InstantiationException {
        Class<Cat> catClass = Cat.class;
        Cat cat = catClass.getConstructor().newInstance();
        Method method = catClass.getDeclaredMethod("eat", String.class);
        method.setAccessible(true);
        String invoke = (String) method.invoke(cat, "屎");
        System.out.println(invoke);
       /* Field[] declaredFields = catClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        Field field = catClass.getDeclaredField("COUNTRY");
        field.set(COUNTRY,"22");
        field.get(COUNTRY);*/
       // System.out.println(field);
    }
}
